﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GS1.Entidad;
using System.Data;
using GS1.DataAccess;
using log4net;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using GS1.Utilitario;

namespace GS1.Datos
{
    public class LoginDA
    {

        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(LoginDA));

        // Nombre procedimiento almacenado
        private const string PROCEDIMIENTO_RFID_OBTENERMENU = "beta.PPPG_CTRL_VEHI_RFID.pppr_obte_menu";
       
        // Parametros Entrada

        //Registrar
        private const string PARAM_COD_USUA = "PV_COD_USUA";
        private const string PARAM_COD_MODU = "PV_COD_MODU";

        // Parametros Salida
        private const string PARAM_CURSOR = "PC_LIST";
        private const string PARAM_CODPERFIL = "COD_PERF";
        private const string PARAM_ERRO = "PN_ERRO";
        private const string PARAM_MENS = "PV_MENS";

        #endregion

        #region --- Metodos Propios ---
        public Login obtenerMenu(Login login)
        {
            Login loginResultado = null;

            //DataSet dsLogin = new DataSet();

            if (log.IsDebugEnabled)
            {
                log.Debug("obtenerMenu(" + login.usuarioUsua + login.codApli + ")");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexHermes))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_OBTENERMENU;
                db.agregarParametro(PARAM_COD_USUA, DbType.String, ParameterDirection.Input, login.usuarioUsua);
                db.agregarParametro(PARAM_COD_MODU, DbType.String, ParameterDirection.Input, login.codApli);
                db.agregarParametro(PARAM_CODPERFIL, DbType.String, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output);
                db.agregarParametro(PARAM_ERRO, DbType.Int32, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_MENS, DbType.String, ParameterDirection.Output, null);


                db.ejecutar();

                OracleDataReader reader = db.obtenerOracleDataReader();

                ListaMenuHTB listaMenu = new ListaMenuHTB();

                while (reader.Read())
                {
                   MenuHTB menu = new MenuHTB();  
                   menu.codMenu = Convert.ToString(reader.GetValue(0));  
                   menu.codOpcion = Convert.ToString(reader.GetValue(1));
                   menu.desOpcion = Convert.ToString(reader.GetValue(2));
                   menu.indSubMenu = Convert.ToString(reader.GetValue(3));


                   listaMenu.add(menu);
                }

                Login loginObtenido = new Login();

                loginObtenido.listaMenuHTB = new ListaMenuHTB();
                loginObtenido.listaMenuHTB.lista = (ListPersonalizada<MenuHTB>)listaMenu.lista;

                loginObtenido.codPerfil = Convert.ToString(db.obtenerParametro(PARAM_CODPERFIL).Value);

                Mensaje mensajeException = new Mensaje();

                Oracle.DataAccess.Types.OracleDecimal c = (Oracle.DataAccess.Types.OracleDecimal)db.obtenerParametro(PARAM_ERRO).Value;

                mensajeException.pn_erro = c.ToInt32();
                mensajeException.pv_mens = Convert.ToString(db.obtenerParametro(PARAM_MENS).Value);

                if (mensajeException.pn_erro != 0)
                {
                    log.Error(mensajeException.pn_erro);
     
                    loginResultado = null;
                    return loginResultado;
                }

                loginResultado = loginObtenido;

                reader.Close();
                db.cerrar();
            }

            return loginResultado;
        }

        #endregion

    }
}
